Passed
Push — master ( 2e9cf2...006e66 )
by EMP
01:13
created

main.js ➔ updateAddressCounts   A

Complexity

Conditions 3

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 3
1
"use strict";
2
3
sodium.ready.then(function() {
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
4
5
const ae = new AllEars(function(ok) {
1 ignored issue
show
Bug introduced by
The variable AllEars seems to be never declared. If this is a global, consider adding a /** global: AllEars */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
6
	if (ok) {
7
		document.getElementById("txt_skey").style.background = "#466";
8
		document.getElementById("txt_skey").maxLength = "64";
9
	} else {
10
		console.log("Failed to load All-Ears");
11
	}
12
});
13
14
let tab="inbox";
15
let page=0;
16
17
// Helper functions
18
function getCountryName(countryCode) {
19
	const opts = document.getElementById("gatekeeper_country");
20
21
	for (let i = 0; i < opts.length; i++) {
22
		if (opts[i].value === countryCode) {
23
			return opts[i].textContent;
24
		}
25
	}
26
27
	return "Unknown countrycode: " + countryCode;
28
}
29
30
function getCountryFlag(countryCode) {
31
	return sodium.to_string(new Uint8Array([
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
32
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
33
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
34
	]));
35
}
36
37
function getMsgId(num) {
38
	let i;
39
	if (ae.GetExtMsgHeaders(num).toLowerCase().slice(0, 11) === "message-id:") {
40
		i = 0;
41
	} else {
42
		i = ae.GetExtMsgHeaders(num).toLowerCase().indexOf("\nmessage-id:");
43
		if (i < 1) return "ERR";
44
		i++;
45
	}
46
47
	const x = ae.GetExtMsgHeaders(num).slice(i + 11).trim();
48
	if (x[0] !== "<") return "ERR2";
49
	return x.slice(1, x.indexOf(">"));
50
}
51
52
function displayMsg(isInt, num) {
53
	document.getElementById("midright").scroll(0, 0);
54
55
	const ts = isInt? ae.GetIntMsgTime(num) : ae.GetExtMsgTime(num);
56
57
	document.getElementById("btn_reply").disabled = false;
58
	document.getElementById("btn_reply").onclick = function() {
59
		document.getElementById("write_recv").value = isInt? ae.GetIntMsgFrom(num) : ae.GetExtMsgFrom(num);
60
		document.getElementById("write_subj").value = "Re: " + (isInt ? ae.GetIntMsgTitle(num) : ae.GetExtMsgTitle(num));
61
		document.getElementById("write_rply").textContent = (isInt? "" : getMsgId(num));
62
		document.getElementById("btn_write").click();
63
		document.getElementById("div_write_1").hidden = false;
64
		document.getElementById("div_write_2").hidden = true;
65
		document.getElementById("write_body").focus();
66
		for (const opt of document.getElementById("write_from").options) {
67
			if (opt.value === (isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num))) {
68
				opt.selected = true;
69
			}
70
		}
71
	};
72
73
	document.getElementById("msg").hidden = false;
74
	document.getElementById("msg").getElementsByTagName("h1")[0].textContent = isInt ? ae.GetIntMsgTitle(num) : ae.GetExtMsgTitle(num);
75
	document.getElementById("msg").getElementsByTagName("pre")[0].textContent = isInt ? ae.GetIntMsgBody(num) : ae.GetExtMsgBody(num);
76
77
	document.getElementById("readmsg_to").textContent = isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num);
78
	document.getElementById("readmsg_date").children[0].textContent = new Date(ts * 1000).toISOString().slice(0, 19).replace("T", " ");
79
80
	if (!isInt) {
81
		document.getElementById("readmsg_ip").hidden = false;
82
		document.getElementById("readmsg_country").hidden = false;
83
		document.getElementById("readmsg_tls").hidden = false;
84
		document.getElementById("readmsg_greet").hidden = false;
85
		document.getElementById("readmsg_timing").hidden = false;
86
		document.getElementById("readmsg_envfrom").hidden = false;
87
88
		const cc = ae.GetExtMsgCountry(num);
89
90
		document.getElementById("readmsg_ip").children[0].textContent = ae.GetExtMsgIp(num);
91
		document.getElementById("readmsg_country").textContent = getCountryFlag(cc) + " " + getCountryName(cc);
92
		document.getElementById("readmsg_tls").children[0].textContent = ae.GetExtMsgTLS(num);
93
		document.getElementById("readmsg_greet").children[0].textContent = ae.GetExtMsgGreet(num);
94
		document.getElementById("readmsg_envfrom").textContent = ae.GetExtMsgFrom(num);
95
96
		let flagText = "";
97
		if (!ae.GetExtMsgFlagVPad(num)) flagText += "<abbr title=\"Invalid padding\">PAD</abbr> ";
98
		if (!ae.GetExtMsgFlagVSig(num)) flagText += "<abbr title=\"Invalid signature\">SIG</abbr> ";
99
		if (!ae.GetExtMsgFlagPExt(num)) flagText += "<abbr title=\"The sender did not use the Extended (ESMTP) protocol\">SMTP</abbr> ";
100
		if (!ae.GetExtMsgFlagQuit(num)) flagText += "<abbr title=\"The sender did not issue the required QUIT command\">QUIT</abbr> ";
101
		if (ae.GetExtMsgFlagRare(num)) flagText += "<abbr title=\"The sender issued unusual command(s)\">RARE</abbr> ";
102
		if (ae.GetExtMsgFlagFail(num)) flagText += "<abbr title=\"The sender issued invalid command(s)\">FAIL</abbr> ";
103
		if (ae.GetExtMsgFlagPErr(num)) flagText += "<abbr title=\"The sender violated the protocol\">PROT</abbr> ";
104
		document.getElementById("readmsg_flags").children[0].innerHTML = flagText.trim();
105
	} else {
106
		document.getElementById("readmsg_ip").hidden = true;
107
		document.getElementById("readmsg_country").hidden = true;
108
		document.getElementById("readmsg_tls").hidden = true;
109
		document.getElementById("readmsg_greet").hidden = true;
110
		document.getElementById("readmsg_timing").hidden = true;
111
		document.getElementById("readmsg_envfrom").hidden = true;
112
113
		let symbol = "<span title=\"Invalid level\">&#x26a0;</span>";
114
		if (ae.GetIntMsgFrom(num) === "system") {if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"System\">&#x1f162;</span>";} // S (System)
115
		else if (ae.GetIntMsgLevel(num) === 0) symbol = "<span title=\"Level 0 User\">&#x1f10c;</span>"; // 0
116
		else if (ae.GetIntMsgLevel(num) === 1) symbol = "<span title=\"Level 1 User\">&#x278a;</span>"; // 1
117
		else if (ae.GetIntMsgLevel(num) === 2) symbol = "<span title=\"Level 2 User\">&#x278b;</span>"; // 2
118
		else if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"Administrator\">&#x1f150;</span>"; // A (Admin)
119
		document.getElementById("readmsg_from").innerHTML = symbol + " " + ae.GetIntMsgFrom(num);
120
121
		let flagText = "";
122
		if (!ae.GetIntMsgFlagVPad(num)) flagText += "<abbr title=\"Invalid padding\">PAD</abbr> ";
123
		if (!ae.GetIntMsgFlagVSig(num)) flagText += "<abbr title=\"Invalid signature\">SIG</abbr> ";
124
		document.getElementById("readmsg_flags").children[0].innerHTML = flagText.trim();
125
	}
126
}
127
128
// Interface
129
function addMsg(isInt, i) {
130
	const inbox = document.getElementById("tbl_inbox");
131
	const sent = document.getElementById("tbl_sent");
132
133
	const isSent = false; //TODO
134
	const table = isSent ? sent : inbox;
135
136
	const row = table.insertRow(-1);
137
	const cellTime = row.insertCell(-1);
138
	const cellSubj = row.insertCell(-1);
139
	const cellSnd1 = row.insertCell(-1);
140
	const cellSnd2 = row.insertCell(-1);
141
142
	const ts = isInt? ae.GetIntMsgTime(i) : ae.GetExtMsgTime(i);
143
	cellTime.setAttribute("data-ts", ts);
144
	cellTime.textContent = new Date(ts * 1000).toISOString().slice(0, 10);
145
146
	cellSubj.textContent = isInt? ae.GetIntMsgTitle(i) : ae.GetExtMsgTitle(i);
147
148
	if (isInt) {
149
		cellSnd1.textContent = ae.GetIntMsgFrom(i);
150
		cellSnd1.className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
151
	} else {
152
		const from1 = ae.GetExtMsgFrom(i);
153
		const from2 = from1.substring(from1.indexOf("@") + 1);
154
		const cc = ae.GetExtMsgCountry(i);
155
156
		cellSnd1.textContent = from1.substring(0, from1.indexOf("@"));
157
158
		const flag = document.createElement("abbr");
159
		flag.textContent = getCountryFlag(cc);
160
		flag.title = getCountryName(cc);
161
		cellSnd2.appendChild(flag);
162
163
		const fromText = document.createElement("span");
164
		fromText.textContent = " " + from2;
165
		cellSnd2.appendChild(fromText);
166
	}
167
168
//	divDel.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetIntMsgIdHex(i) + "\">";
169
170
	row.onclick = function() {
171
		displayMsg(isInt, i);
172
	};
173
/*
174
	cellDel.children[0].onchange = function() {
175
		if (!divDel.children[0].checked) {
176
			const checkboxes = elmt.getElementsByTagName("input");
177
			let checked = false;
178
179
			for (let j = 0; j < checkboxes.length; j++) {
180
				if (checkboxes[j].checked) {
181
					checked = true;
182
					break;
183
				}
184
			}
185
186
			if (!checked) {
187
				document.getElementById(isSent ? "btn_sentdel" : "btn_msgdel").hidden = true;
188
				return;
189
			}
190
		}
191
192
		document.getElementById(isSent? "btn_sentdel" : "btn_msgdel").hidden = false;
193
	};
194
*/
195
}
196
197
function getRowsPerPage() {
198
	const tbl = document.getElementById("tbl_inbox");
199
	tbl.innerHTML = "";
200
	const row = tbl.insertRow(-1);
201
	const cell = row.insertCell(-1);
202
	cell.textContent = "0";
203
204
	const rowsPerPage = Math.floor(getComputedStyle(document.querySelector("#div_inbox")).height.replace("px", "") / getComputedStyle(document.querySelector("#tbl_inbox > tbody > tr:first-child")).height.replace("px", "")) - 1; // -1 allows space for 'load more'
205
	tbl.innerHTML = "";
206
	return rowsPerPage;
207
}
208
209
function addMessages() {
210
	const rowsPerPage = getRowsPerPage();
211
	let skipMsgs = rowsPerPage * page;
212
213
	const maxExt = ae.GetExtMsgCount();
214
	const maxInt = ae.GetIntMsgCount();
215
216
	let numExt = 0;
217
	let numInt = 0;
218
	let numAdd = 0;
219
220
	while (numAdd < rowsPerPage) {
221
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : 0;
222
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : 0;
223
		if (tsInt === 0 && tsExt === 0) break;
224
225
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
226
			if (skipMsgs > 0) skipMsgs--; else {addMsg(true, numInt); numAdd++;}
227
			numInt++;
228
		} else if (tsExt !== 0) {
229
			if (skipMsgs > 0) skipMsgs--; else {addMsg(false, numExt); numAdd++;}
230
			numExt++;
231
		}
232
	}
233
234
	if (ae.GetReadyMsgKilos() < ae.GetTotalMsgKilos()) {
235
		const inbox = document.getElementById("tbl_inbox");
236
		const row = inbox.insertRow(-1);
237
		const cell = row.insertCell(-1);
238
		cell.textContent = "Load more (" + (ae.GetTotalMsgKilos() - ae.GetReadyMsgKilos()) + " KiB left)";
239
240
		row.onclick = function() {
241
			this.onclick = "";
242
243
			ae.Message_Browse(false, function(successBrowse) {
244
				document.getElementById("tbl_inbox").style.opacity = 1;
245
246
				if (successBrowse) {
247
					addMessages();
248
				}
249
			});
250
		};
251
	}
252
253
	document.getElementById("btn_left").disabled = (page === 0);
254
	document.getElementById("btn_rght").disabled = ((rowsPerPage * page) + numAdd >= maxExt + maxInt);
255
}
256
257
function updateAddressCounts() {
258
	document.getElementById("limit_normal").textContent = (ae.GetAddressCountNormal() + "/" + ae.GetAddressLimitNormal(ae.GetUserLevel())).padStart(ae.GetAddressLimitNormal(ae.GetUserLevel()) > 9 ? 5 : 1);
259
	document.getElementById("limit_shield").textContent = (ae.GetAddressCountShield() + "/" + ae.GetAddressLimitShield(ae.GetUserLevel())).padStart(ae.GetAddressLimitShield(ae.GetUserLevel()) > 9 ? 5 : 1);
260
	document.getElementById("limit_total").textContent = ((ae.GetAddressCountNormal() + ae.GetAddressCountShield()) + "/" + ae.GetAddrPerUser()).padStart(5);
261
}
262
263
function reloadInterface() {
264
	document.getElementById("div_begin").hidden = true;
265
	document.getElementById("div_main").style.display = "grid";
266
267
	// Contacts
268
	for (let i = 0; i < ae.GetContactCount(); i++) {
269
		addContact(
270
			ae.GetContactMail(i),
271
			ae.GetContactName(i),
272
			ae.GetContactNote(i)
273
		);
274
	}
275
276
	// Addresses
277
	for (let i = 0; i < ae.GetAddressCount(); i++) {
278
		addAddress(i);
279
	}
280
281
	document.getElementById("table_addrs").getElementsByTagName("caption")[0].textContent = "Level " + ae.GetUserLevel() + " User";
282
	updateAddressCounts();
283
}
284
285 View Code Duplication
function deleteAddress(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
286
	let btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
287
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
288
289
	let addressToDelete = -1;
290
291
	for (let i = 0; i < ae.GetAddressCount(); i++) {
292
		if (addr === ae.GetAddress(i)) {
293
			addressToDelete = i;
294
			break;
295
		}
296
	}
297
298
	if (addressToDelete === -1) return;
299
300
	ae.Address_Delete(addressToDelete, function(success) {
301
		if (success) {
302
			document.getElementById("tbl_addrs").deleteRow(addressToDelete);
303
			document.getElementById("write_from").remove(addressToDelete);
304
			updateAddressCounts();
305
306
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) document.getElementById("btn_address_create_normal").disabled = false;
307
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) document.getElementById("btn_address_create_shield").disabled = false;
308
309
			ae.Private_Update(function(success2) {
310
				if (!success2) console.log("Failed to update the Private field");
311
312
				btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
313
				for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
314
			});
315
		} else {
316
			console.log("Failed to delete address");
317
318
			btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
319
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
320
		}
321
	});
322
}
323
324 View Code Duplication
function shieldMix(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
325
	let newAddr = "";
326
327
	for (let i = 0; i < 16; i++) {
328
		switch (addr.charAt(i)) {
329
			case '1':
330
				newAddr += "1iIlL".charAt(Math.floor(Math.random() * 5));
331
				break;
332
			case '0':
333
				newAddr += "0oO".charAt(Math.floor(Math.random() * 3));
334
				break;
335
			case 'w':
336
				newAddr += "VvWw".charAt(Math.floor(Math.random() * 4));
337
				break;
338
			default:
339
				newAddr += (Math.random() > 0.5) ? addr.charAt(i) : addr.charAt(i).toUpperCase();
340
		}
341
	}
342
343
	return newAddr;
344
}
345
346
function addAddress(num) {
347
	const addrTable = document.getElementById("tbl_addrs");
348
	const row = addrTable.insertRow(-1);
349
	const cellAddr = row.insertCell(-1);
350
	const cellChk1 = row.insertCell(-1);
351
	const cellChk2 = row.insertCell(-1);
352
	const cellChk3 = row.insertCell(-1);
353
	const cellBtnD = row.insertCell(-1);
354
355
	cellAddr.textContent = ae.GetAddress(num);
356
	cellAddr.onclick = function() {
357
		if (cellAddr.textContent.length === 16)
358
			navigator.clipboard.writeText(shieldMix(cellAddr.textContent) + "@" + ae.GetDomain());
1 ignored issue
show
Bug introduced by
The variable navigator seems to be never declared. If this is a global, consider adding a /** global: navigator */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
359
		else
360
			navigator.clipboard.writeText(cellAddr.textContent + "@" + ae.GetDomain());
361
	};
362
363
	cellChk1.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
364
	cellChk2.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
365
	cellChk3.innerHTML = ae.GetAddressUse_Gk(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
366
367
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
368
	cellBtnD.onclick = function() {deleteAddress(cellAddr.textContent);};
369
370
	const opt = document.createElement("option");
371
	opt.value = cellAddr.textContent;
372
	opt.textContent = cellAddr.textContent + "@" + ae.GetDomain();
373
	document.getElementById("write_from").appendChild(opt);
374
}
375
376
document.getElementById("btn_updt").onclick = function() {
377
	const btn = this;
378
	btn.disabled = true;
379
	btn.blur();
380
381
	if (tab === "inbox") {
382
		document.getElementById("tbl_inbox").style.opacity = 0.5;
383
384
		ae.Message_Browse(true, function(successBrowse) {
385
			document.getElementById("tbl_inbox").style.opacity = 1;
386
387
			if (successBrowse) {
388
				addMessages();
389
				btn.disabled = false;
390
			} else {
391
				console.log("Failed to refresh");
392
				btn.disabled = false;
393
			}
394
		});
395
	}
396
};
397
398
function addContact(mail, name, note) {
399
	const tbl = document.getElementById("tbl_ctact");
400
	const row = tbl.insertRow(-1);
401
	const cellMail = row.insertCell(-1);
402
	const cellName = row.insertCell(-1);
403
	const cellNote = row.insertCell(-1);
404
	const cellBtnD = row.insertCell(-1);
405
406
	cellMail.textContent = mail;
407
	cellName.textContent = name;
408
	cellNote.textContent = note;
409
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
410
411
	cellMail.contentEditable = true;
412
	cellName.contentEditable = true;
413
	cellNote.contentEditable = true;
414
415
	cellBtnD.onclick = function() {row.remove();};
416
}
417
418
document.getElementById("btn_newcontact").onclick = function() {
419
	addContact("", "", "");
420
}
421
422
document.getElementById("btn_savecontacts").onclick = function() {
423
	while (ae.GetContactCount() > 0) {
424
		ae.DeleteContact(0);
425
	}
426
427
	for (const row of document.getElementById("tbl_ctact").rows) {
428
		ae.AddContact(row.cells[0].textContent, row.cells[1].textContent, row.cells[2].textContent);
429
	}
430
431
	const btn = this;
432
	btn.disabled = true;
433
434
	ae.Private_Update(function(success) {
435
		btn.disabled = false;
436
437
		if (!success) {
438
			console.log("Failed contacts update");
439
		}
440
	});
441
}
442
443
// Tabs
444
function setupButtons() {
445
	switch(tab) {
446
		case "inbox":
447
		case "snbox":
448
			document.getElementById("btn_dele").disabled = false;
449
			document.getElementById("btn_left").disabled = false; // depends
450
			document.getElementById("btn_cent").disabled = true;
451
			document.getElementById("btn_rght").disabled = false; // depends
452
			document.getElementById("btn_updt").disabled = false;
453
		break;
454
		case "write":
455
			document.getElementById("btn_dele").disabled = false; // depends
456
			document.getElementById("btn_left").disabled = false; // depends
457
			document.getElementById("btn_cent").disabled = true;
458
			document.getElementById("btn_rght").disabled = false;
459
			document.getElementById("btn_updt").disabled = true;
460
		break;
461
		case "notes":
462
			document.getElementById("btn_dele").disabled = true;
463
			document.getElementById("btn_left").disabled = false; // depends
464
			document.getElementById("btn_cent").disabled = true;
465
			document.getElementById("btn_rght").disabled = false; // depends
466
			document.getElementById("btn_updt").disabled = true; // depends
467
		break;
468
		case "prefs":
469
			document.getElementById("btn_dele").disabled = true;
470
			document.getElementById("btn_left").disabled = false; // depends
471
			document.getElementById("btn_cent").disabled = true;
472
			document.getElementById("btn_rght").disabled = false; // depends
473
			document.getElementById("btn_updt").disabled = true; // depends
474
		break;
475
	}
476
}
477
478
document.getElementById("btn_left").onclick = function() {
479
	switch (tab) {
480
		case "inbox":
481
			page--;
482
			addMessages();
483
		break;
484
		case "write":
485
			document.getElementById("div_write_1").hidden = false;
486
			document.getElementById("div_write_2").hidden = true;
487
			document.getElementById("write_body").focus();
488
		break;
489
	}
490
491
	this.blur();
492
};
493
494
document.getElementById("btn_rght").onclick = function() {
495
	switch (tab) {
496
		case "inbox":
497
			page++;
498
			addMessages();
499
		break;
500
		case "write":
501
			if (!document.getElementById("div_write_1").hidden) {
502
				ae.Address_Lookup(document.getElementById("write_recv").value, function(pk) {
503
					if (pk) {
504
						document.getElementById("div_write_1").hidden = true;
505
						document.getElementById("div_write_2").hidden = false;
506
507
						document.getElementById("write2_from").textContent = document.getElementById("write_from").value + "@" + ae.GetDomain();
508
						document.getElementById("write2_recv").textContent = document.getElementById("write_recv").value;
509
						document.getElementById("write2_pkey").textContent = sodium.to_hex(pk);
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
510
511
						document.getElementById("write2_subj").textContent = document.getElementById("write_subj").value;
512
						document.getElementById("write2_rply").textContent = document.getElementById("write_rply").textContent;
513
						document.getElementById("write2_body").textContent = document.getElementById("write_body").value;
514
					} else {
515
						console.log("Failed lookup");
516
					}
517
				});
518
			} else if (!document.getElementById("div_write_2").hidden) {
519
				const topk = (document.getElementById("write2_recv").textContent.indexOf("@") > 0) ? null : sodium.from_hex(document.getElementById("write2_pkey").textContent);
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
520
				ae.Message_Create(document.getElementById("write_subj").value, document.getElementById("write_body").value, document.getElementById("write_from").value, document.getElementById("write_recv").value, document.getElementById("write_rply").textContent, topk, function(success) {
521
					if (success) {
522
						console.log("Sent ok");
523
					} else {
524
						console.log("Failed sending");
525
					}
526
				});
527
			}
528
		break;
529
	}
530
531
	this.blur();
532
};
533
534
for (const btn1 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
535
	btn1.onclick = function() {
536
		for (const btn2 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
537
			const isMatch = (btn1 === btn2);
538
			btn2.disabled = isMatch;
539
			document.getElementById("div_" + btn2.id.slice(4)).hidden = !isMatch;
540
541
			if (isMatch) {
542
				tab = btn2.id.slice(4);
543
				setupButtons();
544
			}
545
		}
546
	};
547
}
548
549
function addressCreate(addr) {
550
	const btnN = document.getElementById("btn_address_create_normal");
551
	const btnS = document.getElementById("btn_address_create_shield");
552
	btnN.disabled = true;
553
	btnS.disabled = true;
554
555
	ae.Address_Create(addr, function(success1) {
556
		if (success1) {
557
			ae.Private_Update(function(success2) {
558
				addAddress(ae.GetAddressCount() - 1);
559
				if (addr !== "SHIELD") document.getElementById("txt_address_create_normal").value = "";
560
				updateAddressCounts();
561
562
				if (!success2) console.log("Failed to update the Private field");
563
564
				if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
565
				if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
566
			});
567
		} else {
568
			console.log("Failed to add address");
569
570
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
571
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
572
		}
573
	});
574
}
575
576
document.getElementById("btn_address_create_normal").onclick = function() {
577
	if (ae.GetAddressCountNormal() >= ae.GetAddressLimitNormal(ae.GetUserLevel())) return;
578
579
	const txtNewAddr = document.getElementById("txt_address_create_normal");
580
	if (!txtNewAddr.reportValidity()) return;
581
582
	addressCreate(txtNewAddr.value);
583
}
584
585
document.getElementById("btn_address_create_shield").onclick = function() {
586
	if (ae.GetAddressCountShield() >= ae.GetAddressLimitShield(ae.GetUserLevel())) return;
587
588
	addressCreate("SHIELD");
589
};
590
591
document.getElementById("txt_skey").onkeyup = function(event) {
592
	if (event.key === "Enter") {
593
		event.preventDefault();
594
		document.getElementById("btn_enter").click();
595
	}
596
};
597
598
document.getElementById("btn_enter").onclick = function() {
599
	const txtSkey = document.getElementById("txt_skey");
600
	if (!txtSkey.reportValidity()) return;
601
602
	const btn = this;
603
	btn.disabled = true;
604
	document.getElementById("txt_skey").style.background = "#233";
605
606
	ae.SetKeys(txtSkey.value, function(successSetKeys) {
607
		if (successSetKeys) {
608
			ae.Account_Browse(0, function(successBrowse) {
609
				if (successBrowse) {
610
					txtSkey.value = "";
611
					reloadInterface();
612
					document.getElementById("btn_updt").click();
613
				} else {
614
					console.log("Failed to enter");
615
					btn.disabled = false;
616
					document.getElementById("txt_skey").style.background = "#466";
617
					txtSkey.focus();
618
				}
619
			});
620
		} else {
621
			console.log("Invalid format for key");
622
			btn.disabled = false;
623
			document.getElementById("txt_skey").style.background = "#466";
624
			txtSkey.focus();
625
		}
626
	});
627
};
628
629
});
630